package br.com.geftu.dao;

import br.com.geftu.HibernateUtil.HibernateUtil;
import java.awt.HeadlessException;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.exception.ConstraintViolationException;

/**
 *
 * @author jorgenei
 * @param <Referencia>
 */
public class DAO<Referencia> implements InterfaceDAO {

    private final Session sessao;
    Transaction transacao = null;
    private Referencia referencia;

    public DAO(Referencia referencia) {
        this.sessao = HibernateUtil.getSessionFactory().openSession();
        this.referencia = referencia;
    }

    @Override
    public void excluir() {
        transacao = sessao.beginTransaction();
        sessao.delete(referencia);
        transacao.commit();
    }

    @Override
    public void atualiza() {
      try {
            JOptionPane.showMessageDialog(null, "refe: "+referencia.toString());
            transacao = sessao.beginTransaction();
            sessao.update(referencia);
            transacao.commit();
            sessao.close();
            JOptionPane.showMessageDialog(null, "refe: "+transacao.toString());
            
        } catch (ConstraintViolationException e) {
            JOptionPane.showMessageDialog(null, "Erro na inserção: Registro Duplicado");
            System.out.println(e.getCause());
            transacao.rollback();
        } catch (HibernateException e) {
            if (e.getCause() != null) {
                JOptionPane.showMessageDialog(null, "Erro na insersão : " + e);
                transacao.rollback();
            }
        } catch (HeadlessException e) {
            if (e.getCause() != null) {
                JOptionPane.showMessageDialog(null, "Erro na insersão : " + e);
                transacao.rollback();
            }
        }
    }

    @Override
    public List lista_todos(String classe) {

        List lista = sessao.createQuery("from " + classe).list();
        return lista;
    }

    //@Override
    public List lista_um(String classe, String campo, String parametro) {

        //List lista = sessao.createQuery("select " + campo + " from " + classe + " d where d.cpf = '" + parametro + "'").list();
        List lista = sessao.createQuery("select cpf from Desenvolvedor d where d.cpf = '68896280044'").list();
        JOptionPane.showMessageDialog(null, lista.toString());
        return lista;
    }
// Retorna campo
    public List lista_campo_existe(String nameD, String campo, String parametro) {
        Boolean result;
           Query q = sessao.getNamedQuery(nameD)
                .setString(campo, parametro);
        result = q.list().size() > 0;
        //JOptionPane.showMessageDialog(null, q.list()+" "+campo+" "+parametro);
        return q.list();
    }

    @Override
    public void insere() throws HibernateException {
        try {
            JOptionPane.showMessageDialog(null, "refe: "+referencia.toString());
            transacao = sessao.beginTransaction();
            sessao.saveOrUpdate(referencia);
            transacao.commit();
            
        } catch (ConstraintViolationException e) {
            JOptionPane.showMessageDialog(null, "Erro na inserção: Registro Duplicado");
            System.out.println(e.getCause());
            transacao.rollback();
        } catch (HibernateException e) {
            if (e.getCause() != null) {
                JOptionPane.showMessageDialog(null, "Erro na insersão : " + e);
                transacao.rollback();
            }
        } catch (HeadlessException e) {
            if (e.getCause() != null) {
                JOptionPane.showMessageDialog(null, "Erro na insersão : " + e);
                transacao.rollback();
            }
        }finally{
            sessao.close();
        }
    }
}
